<?php
/* НАСТРОЙКИ */
error_reporting(-1);
// Куда сохранять сжатые файлы. Поставьте права на запись для каталога.
// Если каталога не существует, он скорее всего будет создан, если
// ничего не перемудрить. Лучше оставить как есть сейчас.
$sCachePath			= $_SERVER['DOCUMENT_ROOT'] . '/cache/jscss/';

// 0 - не сжимать, 9 - максимальное сжатие.
$iEncodingLevel		= 9;

// Файлы можно кэшировать и на стороне клиента.
// 60с. * 60м. = 3600c. = 1 час ускоренной работы сайта.
$iExpiresOffset = 3600;

/* ######### */

mkdir($sCachePath);

// Будьте любезны, дальше ничего не исправляйте самостоятельно :). Спасибо!



// По умолчанию здесь файл, относитьельно DOCUMENT_ROOT
// не по умолчанию за деньги :)
$sURL = $_SERVER['REQUEST_URI'];
$sURL = preg_replace('|[\?\#](.*)|is', "", $sURL);
$sDR  = $_SERVER['DOCUMENT_ROOT'];

if (!file_exists($sDR . $sURL)){
    die();
}   // Не найден исходник для кэширования.



$sCachedName = str_replace('/', '%', $sURL);   // Новое имя в кэше
$bGzip	= false;
$sEnc 	= '';

$ct = preg_match('/\.css/i', $sURL) ? 'text/css' : 'text/javascript';
header('Content-type: ' . $ct);
header('Vary: Accept-Encoding');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $iExpiresOffset) . ' GMT');

$sourceFile = $sDR . $sURL;
$date  		= date('YmdHis', filemtime($sourceFile));
$cacheFile 	= $sCachePath . $date . '_' . $sCachedName;

// если указано, что браузер принимает что-то нестандартное
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
{
    $sEncodings = strtolower($_SERVER['HTTP_ACCEPT_ENCODING']);
    if (strpos($sEncodings, 'gzip') !== false)
    {
        // если дальше все упакуется и не пакуется по умолчанию из-за настроек
        if (function_exists('ob_gzhandler') && !ini_get('zlib.output_compression'))
        {
            $bGzip = true;
            header('Content-Encoding: gzip');
        }
    }
}


if ($bGzip)
{
    // если нет кэша (возможно из-за изменения даты модификации файла)
    if (!file_exists($cacheFile))
    {
        // удаляем возможные остатки предыдущих версий
        removeOldCache($sCachedName);
        // проверяем путь к папке кэша и пакуем
        forcePath($sCachePath);
        $cacheData = gzencode(getFileContents($sourceFile), $iEncodingLevel, FORCE_GZIP);
        putFileContents($cacheFile, $cacheData);
    }
    // отдаем запакованную версию
    echo getFileContents($cacheFile);
    die();
}

// если дошли до этого места, то gzip скорее всего не поддерживается
echo getFileContents($sourceFile);



/* Внутренние Функции */


function removeOldCache($sFileName)
{
    global $sCachePath;
    if ($dir = opendir($sCachePath))
    {
        while (($file = readdir($dir)) !== false)
        {
            if (strpos($file, $sFileName) !== false)
                @unlink($sCachePath . $file);
        }
    }
}


function getFileContents($sFile)
{
    $sContent = '';
    $fp = @fopen($sFile, 'r');
    if (!$fp)
        return '';

    while (!feof($fp))
        $sContent .= fgets($fp);

    fclose($fp);

    return $sContent;
}


function putFileContents($sFile, $sContent)
{
    $fp = @fopen($sFile, 'wb');
    if ($fp)
    {
        fwrite($fp, $sContent);
        fclose($fp);
    }
}


function forcePath($sPath, $chmod = 0755)
{
    $dd = explode('/', $sPath);
    $p = ''; $r = false;
    foreach ($dd as $d) {
        $p .= $d . '/';
        $r = @mkdir($p);
        @chmod($p, $chmod);
    }
    return $r;
}